import axios, { type Method } from 'axios'
// 引入仓库
import { useUserStore } from '@/stores'
// vant 请提示
import { showToast } from 'vant'
// 引入路哟
import router from '@/router'
const baseURL = 'https://consult-api.itheima.net/'
// 创建一个axios实例
const instance = axios.create({
  // 基础地址 ，超时时间
  baseURL,
  timeout: 10000,
})
// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 携带token
    const store = useUserStore()
    if (store.user?.token && config.headers) {
      config.headers.Authorization = `Bearer ${store.user.token}`
    }

    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 响应拦截器
instance.interceptors.response.use(
  (res) => {
    // 处理业务失败
    if (res.data?.code !== 10000) {
      showToast(res.data?.message || '业务失败')
      return Promise.reject(res.data)
    }
    // 获取核心响应数据
    return res.data
  },
  (err) => {
    // 处理401 请求报错 现在在/user/patient 页面下 发起一个获取用户信息的请求 但是此时token过期
    // 跳转到登录页 登陆成功 需要跳回/user/patient 页面
    if (err.response.status === 401) {
      // token已经过期了 用户信息也要删除
      const store = useUserStore()
      store.delUser()
      // router.currentRoute.value.fullPath 获取完整路径
      router.push({
        path: '/login',
        query: { returnUrl: router.currentRoute.value.fullPath },
      })
    }
    return Promise.reject(err)
  }
)

// 请求工具函数
// 2.1 参数 url method submitData
// 22 返回 instance 调用接口的promise对象

type Data<T> = {
  code: string
  message: string
  data: T
}
const request = <T>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  return instance.request<T, Data<T>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
  })
}

// type ResData<T> = {
//   code: number
//   data: T
//   message: string
// }
// type RequestArgs = {
//   method?: Method
//   url: string
//   data?: object
// }
// const request = <T>(args: RequestArgs) => {
//   const { method = 'GET', url, data } = args
//   return instance.request<T, ResData<T>>({
//     method,
//     url,
//     [method.toUpperCase() === 'GET' ? 'params' : 'data']: data,
//   })
// }
export { baseURL, instance, request }
